<?php
require_once('Validator.php');

class ValidatorTest
{
	const FILTER_NO_HTML = 0;
	const FILTER_NO_JS = 1;
	
	/**
	 * Testar e-postvalidering
	 * @author Filip Åstrand, fa222cm
	 */
	public function TestValidateEmail()
	{
		// Olika testkombinationer av epostadresser
		$validEmails = array('fa222cm@lnu.se','fa.222cm@student.lnu.se','fa222cm@student.lnu.se','fa.222cm@lnu.se');
		$invalidEmails = array('fa222cm@lnu.','fa.222cm@.se','@student.lnu.se');
		
		$emailValidationErrors = 0;
		
		// Lagra meddelanden
		$output = array();
		
		for ($i=0; $i<count($validEmails); $i++)
		{
			// Om inte en epostkombination är giltig
			if(!Validator::ValidateEmail($validEmails[$i]))
				$emailValidationErrors++;
		}
		
		if($emailValidationErrors == 0)
			$output[] = "OK: Validering av korrekta epostadresser lyckades";
		else
			$output[] = "FEL 1: Validering av epost misslyckades";
		
		// Nollställer räknare
		$emailValidationErrors = 0;
		
		for ($i=0; $i<count($invalidEmails); $i++)
		{
			// Om en inkorrekt epostkombination är giltig
			if(Validator::ValidateEmail($invalidEmails[$i]))
				$emailValidationErrors++;
		}
		
		if($emailValidationErrors == 0)
			$output[] = "OK: Inkorrekta epostadresser klarade inte validering.";
		else
			$output[] = "FEL 2: Inkorrekta epostadresser klarade validering.";
		
		// Skriv ut resultat av samtliga tester.
		foreach ($output as $p)
			echo "<p>$p</p>";
	}

	/**
	 * Test för filtrerade textsträngar
	 */
	 public function TestFilterString()
	 {
	 	$stringWithHTML = "<span class='test'>Lorem ipsum</span>";
		$stringWithJS = "<script type='text/javascript'>document.write('Hello World!')</script>";
		$stringWithJSAndHTML = "<p><span>Lorem</span> <em>ipsum</em><script type='text/javascript'>document.write('Hello World!')</script></p>";
		
		// Lagra meddelanden
		$output = array();
		
		// Filtrera bort HTML
		if(Validator::FilterString($stringWithHTML, self::FILTER_NO_HTML) != "Lorem ipsum")
			$output[] = "FEL 1: Bortfiltrering av HTML i textsträng misslyckades";
		else
			$output[] = "OK: Bortfiltrering av HTML i textsträng lyckades";
			
		// Filtrera bort JavaScript
		if(Validator::FilterString($stringWithJS, self::FILTER_NO_JS) != "")
			$output[] = "FEL 2: Bortfiltrering av JS i textsträng misslyckades";
		else
			$output[] = "OK: Bortfiltrering av JS i textsträng lyckades";
		
		// Filtrera bort JavaScript och HTML
		$result = Validator::FilterString($stringWithJSAndHTML, self::FILTER_NO_JS); // JS
		$result = Validator::FilterString($result, self::FILTER_NO_HTML); // HTML
		
		if($result != "Lorem ipsum")
			$output[] = "FEL 3: Bortfiltrering av JS och HTML i textsträng misslyckades";
		else
			$output[] = "OK: Bortfiltrering av JS och HTML i textsträng lyckades";
			
		// Filtrera bort JavaScript och viss HTML
		$result = Validator::FilterString($stringWithJSAndHTML, self::FILTER_NO_JS); // JS
		$result = Validator::FilterString($result, self::FILTER_NO_HTML, "<span><em>"); // HTML
		
		if($result != "<span>Lorem</span> <em>ipsum</em>")
			$output[] = "FEL 4: Bortfiltrering av JS och viss HTML i textsträng misslyckades";
		else
			$output[] = "OK: Bortfiltrering av JS och viss HTML i textsträng lyckades";
		
		// Skriv ut resultat av samtliga tester.
		foreach ($output as $p)
			echo "<p>$p</p>";
	 }

	/**
	 * Testar validering av nummer
	 */
	 public function TestValidateNumber()
	 {
	 	if(Validator::ValidateNumber("ds") == true)
	 		echo "FEL 1: Test för validering av nummer misslyckades.";
		else if(Validator::ValidateNumber(666) == false)
			echo "FEL 2: Test för validering av nummer misslyckades.";
		else
			echo "OK: Test för validering av nummer lyckades.";
	 }
	 
	 /**
	  * Testar validering av personnummer
	  */
	  public function TestValidateSSN()
	  {
	  	// Formatet ÅÅÅÅMMDD-NNNN
	  	if(Validator::ValidateSSN('19841207-1212') == false)
	  		echo "FEL 1: Ett korrekt personnummer validerades inkorrekt.";
		// Format ÅÅMMDD-NNNN
		else if(Validator::ValidateSSN('841207-1212') == false)
	  		echo "FEL 2: Ett korrekt personnummer validerades inkorrekt.";
	  	// Format ÅÅMMDDNNNN
	  	else if(Validator::ValidateSSN('8412071212') == false)
	  		echo "FEL 3: Ett korrekt personnummer validerades inkorrekt.";
	  	// Format ÅÅÅÅMMDDNNNN
	  	else if(Validator::ValidateSSN('198412071212') == false)
	  		echo "FEL 4: Ett korrekt personnummer validerades inkorrekt.";
	  	else if(Validator::ValidateSSN('198412071232') != false)
	  		echo "FEL 5: Ett felaktigt personnummer validerades korrekt.";		
		else if(Validator::ValidateSSN('99841207-5676') != false)
	  		echo "FEL 6: Ett felaktigt personnummer validerades korrekt.";
		else
			echo "OK: Test för validering av personnummer lyckades";
	  }
	  
	/**
	 * Testar validering av datum
	 */
	public function TestValidateDate()
	{
		// Format: ÅÅÅÅ-MM-DD
		if(Validator::ValidateDate('2084-12-07') != false)
			echo "FEL 1: Validering av framtida datum lyckades";
		// Format: ÅÅ-MM-DD
		else if(Validator::ValidateDate('84-12-07') == false)
			echo "FEL 2: Validering av korrekt datum misslyckades";
		// Format: ÅÅMMDD
		else if(Validator::ValidateDate('841207') == false)
			echo "FEL 3: Validering av korrekt datum misslyckades";
		//else if(Validator::ValidateDate('1984-12-07') == false)
			//echo "FEL 4: Validering av korrekt datum misslyckades";
		else
			echo "OK: Validering av datum lyckades";
	}
	
	/**
	 * Testar validering av lösenord
	 */
	public function TestValidatePassword()
	{
		if(Validator::ValidatePassword('1dv408') == true)
			echo "OK: Validering av lösenord lyckades!";
		else if(Validator::ValidatePassword('1dv408') == false)
			echo "FEL 1: Validering av korrekt lösenord misslyckades!";
		else if(Validator::ValidatePassword('fault') == true)
			echo "FEL 2: Validering av lösenord lyckades med fel lösenord!";
		else
			throw new Exception();
	}
}
?>